home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 9943 / 9943.xpi / content / prefman.js < prev    next >
Text File  |  2009-02-19  |  3KB  |  92 lines

  1. function tagcloudjs_PrefManager() {
  2.     var startPoint="tagcloudjs.";
  3.  
  4.     var pref=Components.classes["@mozilla.org/preferences-service;1"].
  5.         getService(Components.interfaces.nsIPrefService).
  6.         getBranch(startPoint);
  7.  
  8.     var observers={};
  9.  
  10.     // whether a preference exists
  11.     this.exists=function(prefName) {
  12.         return pref.getPrefType(prefName) != 0;
  13.     }
  14.  
  15.     // returns the named preference, or defaultValue if it does not exist
  16.     this.getValue=function(prefName, defaultValue) {
  17.         var prefType=pref.getPrefType(prefName);
  18.  
  19.         // underlying preferences object throws an exception if pref doesn't exist
  20.         if (prefType==pref.PREF_INVALID) {
  21.             return defaultValue;
  22.         }
  23.  
  24.         switch (prefType) {
  25.             case pref.PREF_STRING: return pref.getCharPref(prefName);
  26.             case pref.PREF_BOOL: return pref.getBoolPref(prefName);
  27.             case pref.PREF_INT: return pref.getIntPref(prefName);
  28.         }
  29.     }
  30.  
  31.     // sets the named preference to the specified value. values must be strings,
  32.     // booleans, or integers.
  33.     this.setValue=function(prefName, value) {
  34.         var prefType=typeof(value);
  35.  
  36.         switch (prefType) {
  37.             case "string":
  38.             case "boolean":
  39.                 break;
  40.             case "number":
  41.                 if (value % 1 != 0) {
  42.                     throw new Error("Cannot set preference to non integral number");
  43.                 }
  44.                 break;
  45.             default:
  46.                 throw new Error("Cannot set preference with datatype: " + prefType);
  47.         }
  48.  
  49.         // underlying preferences object throws an exception if new pref has a
  50.         // different type than old one. i think we should not do this, so delete
  51.         // old pref first if this is the case.
  52.         if (this.exists(prefName) && prefType != typeof(this.getValue(prefName))) {
  53.             this.remove(prefName);
  54.         }
  55.  
  56.         // set new value using correct method
  57.         switch (prefType) {
  58.             case "string": pref.setCharPref(prefName, value); break;
  59.             case "boolean": pref.setBoolPref(prefName, value); break;
  60.             case "number": pref.setIntPref(prefName, Math.floor(value)); break;
  61.         }
  62.     }
  63.  
  64.     // deletes the named preference or subtree
  65.     this.remove=function(prefName) {
  66.         pref.deleteBranch(prefName);
  67.     }
  68.  
  69.     // call a function whenever the named preference subtree changes
  70.     this.watch=function(prefName, watcher) {
  71.         // construct an observer
  72.         var observer={
  73.             observe:function(subject, topic, prefName) {
  74.                 watcher(prefName);
  75.             }
  76.         };
  77.  
  78.         // store the observer in case we need to remove it later
  79.         observers[watcher]=observer;
  80.  
  81.         pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal).
  82.             addObserver(prefName, observer, false);
  83.     }
  84.  
  85.     // stop watching
  86.     this.unwatch=function(prefName, watcher) {
  87.         if (observers[watcher]) {
  88.             pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal)
  89.                 .removeObserver(prefName, observers[watcher]);
  90.         }
  91.     }
  92. }